#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>

// void *rout(void *arg)
// {
//     while (true)
//     {
//         printf("I 'm the thread-1\n");
//         sleep(1);
//     }
// }

// void *thread1(void *argc)
// {
//     // while (true)
//     // {
//     //     printf("thread1  returning ......\n");
//     //     sleep(1);
//     // }
//     printf("thread1  returning ......\n");
//     int *p = (int *)malloc(sizeof(int));
//     ;
//     *p = 1;
//     return (void *)p; // 返回值必须是全局的或者用malloc分配的
// }

// void *thread2(void *argc)
// {
//     printf("thread2  returning ......\n");
//     int *p = (int *)malloc(sizeof(int));
//     ;
//     *p = 2;
//     return (void *)p; // 返回值必须是全局的或者用malloc分配的
// }

// void *thread3(void *argc)
// {
//     while (1)
//     {
//         printf("thread3  returning ......\n");
//         sleep(1);
//     }

//     return NULL;
// }



// int main()
// {
//     pthread_t tid;
//     // int ret;

//     // if ((ret = pthread_create(&tid, NULL, rout, NULL)) != 0) // 将错误码通过ret返回
//     // {
//     //     fprintf(stderr, "pthread_create :%s \n", strerror(ret));
//     //     // 用于 ​​将错误码（通常是 errno）转换为对应的可读的错误信息字符串​​。
//     //     // int fprintf(FILE *stream//指向一个文件流的指针, const char *format,//格式化字符串 ...
//     //     // 可变参数，要输出的具体变量);

//     //     exit(EXIT_FAILURE); // EXIT_FAILURE是一个标准宏（预定义宏），表示程序执行失败，应该以“失败状态”退出程序。​
//     // }

//     // void *ret;

//     // // 线程1 创建
//     // pthread_create(&tid, NULL, thread1, NULL);
//     // pthread_join(tid, &ret); // ret指向一个指针，指针指向一个返回值
//     // printf("thread return,thread id is %lX,return code :%d \n", tid, *(int *)ret);//ret转类型再解引用
//     // free(ret);

//     // // 2
//     // pthread_create(&tid, NULL, thread2, NULL);
//     // pthread_join(tid, &ret); // ret指向一个指针，指针指向一个返回值
//     // printf("thread return,thread id is %lX,return code :%d \n", tid, *(int *)ret);
//     // free(ret);

//     // // 3
//     // pthread_create(&tid, NULL, thread3, NULL);
//     //  sleep(3);                // 等待3秒再进行线程等待 --->线程3被其他取消
//     // pthread_cancel(tid);
//     // pthread_join(tid, &ret); // ret指向一个指针，指针指向一个返回值
//     // printf("thread return,thread id is %lX,return code :%d \n", tid, *(int *)ret);
//     // free(ret);

//     // if (ret == PTHREAD_CANCELED)
//     //     printf("thread return,thread id is %lX,return code PTHREAD_CANCELED: \n", tid);
//     // else
//     //     printf("thread return,thread id is %lX,return code :NULL \n", tid);

//     // int i;
//     // for (;;)
//     // {
//     //     printf("我是主线程\n");
//     //     sleep(1);
//     // }
// }


void *thread_run(void* argc)
{
    pthread_detach(pthread_self());
    printf("%s\n",(char*)argc);

    return NULL;

}


int main()
{
    pthread_t tid;
    if(pthread_create(&tid,NULL,thread_run,(void*)"thread1 run...")!=0)
    {
        printf("creat thread errorn\n");
        return 1;
        
    }
    int ret=0;

    sleep(1);//很重要，让线程先分离，在等待

    if(pthread_join(tid,NULL)==0)
    {
        printf("pthread wait success\n");
        ret=0;
    }
    else
    {
        printf("pthread wait failed\n");
        ret=1;
    }

    return ret;


}